package com.snowfield.lb47.lbconfig.service;

import com.snowfield.lb47.lbconfig.domain.FrontProxy;

import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Map;

/**
 * 前端代理Service接口
 *
 * @author snowfield
 * @date 2024-04-01
 */
public interface IFrontProxyService {
    /**
     * 1.重新加载前端代理数据到缓存中
     * 2.重新加载前端代理概要信息到缓存中
     * <p>
     * 相当于每次tomcat生新启动后,都重新加载一次数据
     */
    public void initCache();

    /**
     * 查询前端代理
     *
     * @param id 前端代理主键
     * @return 前端代理
     */
    public FrontProxy selectFrontProxyById(Long id);

    /**
     * 查询前端代理列表
     *
     * @param frontProxy 前端代理
     * @return 前端代理集合
     */
    public List<FrontProxy> selectFrontProxyList(FrontProxy frontProxy);

    /**
     * 新增前端代理
     *
     * @param frontProxy 前端代理
     * @return 结果
     */
    public int insertFrontProxy(FrontProxy frontProxy);

    /**
     * 修改前端代理
     *
     * @param frontProxy 前端代理
     * @return 结果
     */
    public int updateFrontProxy(FrontProxy frontProxy);

    /**
     * 批量删除前端代理
     *
     * @param ids 需要删除的前端代理主键集合
     * @return 结果
     */
    public int deleteFrontProxyByIds(Long[] ids);

    /**
     * 修改前端代理状态
     *
     * @param id     前端代理主键
     * @param status 前端代理状态
     * @return 结果
     */
    public int changeProxyStatus(Long id, String status);

    /**
     * 重新加载策略
     *
     * @return
     */
    public Boolean reloadProxy();

    /**
     * 删除前端代理信息
     *
     * @param id 前端代理主键
     * @return 结果
     */
    public int deleteFrontProxyById(Long id);

    /**
     * 校验前端代理名称是否唯一
     *
     * @param frontProxy 前端代理
     * @return 结果
     */
    public Boolean checkNameUnique(FrontProxy frontProxy);

    /**
     * 校验前端代理绑定地址和端口是否唯一
     *
     * @param frontProxy 前端代理
     * @return 结果
     */
    public Boolean checkBindIpPortUnique(FrontProxy frontProxy);

    /**
     * 查询所有的前端代理配置，以生成keepalived及haproxy组件的配置文件
     *
     * @return 结果
     */
    public int createLBConfigFile();

    /**
     * 查询前端代理概要信息
     * 包括：名称，状态，绑定地址，端口等
     *
     * @return 前端代理概要信息
     */
    public Map<String, Map<String, String>> selectFrontProxySummary();

    /**
     * 检测前端代理配置是否正常
     *
     * @param id 前端代理主键
     * @return 结果
     */
    public String checkProxyConfig(Long id);
}
